package vistas;
import java.util.*;
import java.io.*;
import java.lang.reflect.*;
import javax.swing.*;
import javax.imageio.ImageIO;

import dominioEdificio.*;

import api.*;

import java.awt.*;
import java.awt.event.*;

public class PlanoEdificio extends JPanel implements MouseListener {
	private String idPlano;
	private String pathImagen;
	private Image imagen = null;	
	java.util.List<Dispositivo> dispositivos = new ArrayList<Dispositivo>();
	
	private static int imagenWidth = 20;
	private static int imagenHeigth = 20;
	
	
	public PlanoEdificio(){		
		this.pathImagen = "";
		this.cargarDispositivos();
	}
	
	public PlanoEdificio(String idPlano, String pathImagen){
		this.idPlano = idPlano;
		this.pathImagen = pathImagen;
		addMouseListener(this);
		this.cargarDispositivos();
	}
		
	@Override
	public void paint(Graphics g){		
		imagen = new ImageIcon(this.pathImagen).getImage();		
		this.setPreferredSize(new Dimension(imagen.getWidth(this),imagen.getHeight(this)));
		g.drawImage(imagen, 0, 0, this);
		if (this.pathImagen != "" ) {
			pintarDispositivos(g);
		}		
	}
	
	public void pintarDispositivos(Graphics g){
		Iterator<Dispositivo> itDispositivos = this.dispositivos.iterator();
		Dispositivo disp;
		while (itDispositivos.hasNext()) {
			disp = itDispositivos.next();
			if (disp.getPathIcono().equals("")){
				g.drawRect(disp.getCoordX(), disp.getCoordY(), disp.getWidth(), disp.getHeight());
			}
			else {				
				Image img = new ImageIcon(disp.getPathIcono()).getImage();				
				g.drawImage(img, disp.getCoordX(), disp.getCoordY(), 20, 20, this);				
			}
		}		
	}
		
	public String getId(){
		return this.idPlano;
	}
	
	public String getPathImagen(){
		return this.pathImagen;
	}
	
	// Agrega un dispositivo al plano
	public void agregarDispositivo(Dispositivo dispositivo){
		this.dispositivos.add(dispositivo);
		this.repaint();
	}
	
	public java.util.List<Dispositivo> getDispositivos(){
		return this.dispositivos;
	}
	// Carga la lista de dispositivos asociados al plano
	// TODO: esto va a llamar al manager de XML, por ahora carga cosas estaticamente
	private void cargarDispositivos(){		
		/*String pathVentilador = "src/vistas/imagenes/ventilador.jpg";
		//Image iconoVent = new ImageIcon(pathVentilador).getImage();		
		Dispositivo ventilador = new Dispositivo("Ventilador",this.idPlano,pathVentilador,new Ventilador());
		ventilador.setCoordenadas(70, 80);
		ventilador.setPiso(this.idPlano);
		
		Dispositivo sensorTemperatura = new Dispositivo("Sensor Temperatura",this.idPlano,"",new SensorTemperatura());
		sensorTemperatura.setCoordenadas(100, 100);
		sensorTemperatura.setPiso(this.idPlano);
		
		this.dispositivos.add(ventilador);
		this.dispositivos.add(sensorTemperatura);		
		ControlDispositivos.obtenerInstancia().agregarDispositivoEdificio(ventilador);
		ControlDispositivos.obtenerInstancia().agregarDispositivoEdificio(sensorTemperatura);*/
		
	}
	
	// Devuelve el dispositivo en las coordenadas solicitadas, si no lo hay devuelve
	// objeto apuntando a null.
	public Dispositivo obtenerDispositivo(int x, int y) {
		Dispositivo d = null;
		Iterator<Dispositivo> itDispositivos = this.dispositivos.iterator();
		boolean enc = false;		
		while (itDispositivos.hasNext() && !enc){			
			d = itDispositivos.next();
			if (d.getAreaActiva(x, y)) enc = true;			
			else d = null;
		}
		return d;
	}
	
	public boolean equals(Object obj){	
		boolean salida = false;      
        if (obj != null && (obj.getClass().equals(this.getClass()))) {
           PlanoEdificio plano = (PlanoEdificio) obj;           
           salida = (plano.getId().compareTo(this.getId())==0 &&
        		   plano.getPathImagen().compareTo(this.getPathImagen())==0);
           
           Iterator iteradorDispositivos = this.getDispositivos().iterator();    
           while (iteradorDispositivos.hasNext() && salida){
        	   salida = plano.getDispositivos().contains(iteradorDispositivos.next());
           }
          
           
       }
       return salida;
	}
	public void mouseClicked(MouseEvent arg0) {}
	
	public void mouseEntered(MouseEvent arg0) {}

	public void mouseExited(MouseEvent arg0) {}

	public void mousePressed(MouseEvent arg0) {}

	public void mouseReleased(MouseEvent arg0) {}

	public void eliminarDispositivo(Dispositivo disp) {
		this.dispositivos.remove(disp);
		this.repaint();
	}
}
